package com.ay.smartpark.sdk.common.utils;//package com.ay.sdkclient.sdk.common.utils;
//
//import com.wisdomregulation.data.entitybase.Base_Entity;
//import com.wisdomregulation.data.entitybook2017.Entity_Book_2017_2;
//import org.apache.poi.xwpf.usermodel.*;
//import org.springframework.cglib.beans.BeanMap;
//import org.springframework.util.FileCopyUtils;
//import org.springframework.util.ResourceUtils;
//
//import javax.servlet.http.HttpServletResponse;
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.FileOutputStream;
//import java.lang.reflect.Field;
//import java.text.SimpleDateFormat;
//import java.util.*;
//import java.util.Map.Entry;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//
///**
// * ClassName:DocWriter
// * 所属功能模块: TODO
// * 功能描述:	 替换doc模板中点位符生成新的doc文件
// *
// * @since Ver 1.0
// * @author jiangfei
// * @Date 2018年2月26日 上午9:03:16
// * @更新 2019年5月8日 下午19:03:16
// */
//public class DocWriter {
//
//    //如果不传javaBean，则设置该map值
//    private static ThreadLocal<Map<String, Object>> keyMap = new ThreadLocal<>();
//    //所有模板点位符，用于比对doc模板，由map转化而来
//    private static ThreadLocal<String> allKeystr = new ThreadLocal<>();
//    private static String datePattern = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}";
//    //doc文件存放临时路径
//    private static String tempPath = YmlUtils.getDocWriterTempPath("");
//    private static ThreadLocal<SimpleDateFormat> sdf = new ThreadLocal<SimpleDateFormat>() {
//        @Override
//        protected SimpleDateFormat initialValue() {
//            return new SimpleDateFormat("yyyy-MM-dd HH:mm");
//        }
//    };
//
//    public static void setMap(Map<String, Object> map) {
//        keyMap.set(map);
//    }
//
//    /**
//     * 替换段落文字,包括普通段落和表格中的段落
//     *
//     * @param paragraph 段落
//     * @param map       和doc模板点位符对应的map对象
//     * @return
//     */
//    public static void replaceParaText(XWPFParagraph paragraph, Map<String, Object> map) {
//        List<XWPFRun> run = paragraph.getRuns();
//
//        String text = null;
//        boolean isMerge = false;
//        for (int i = 0; i < run.size(); i++) {
//            String runText = null;
//            String nextRunText = null;
//            runText = run.get(i).getText(run.get(i).getTextPosition());
//            if ((i + 1) != run.size()) {
//                nextRunText = run.get(i + 1).getText(run.get(i + 1).getTextPosition());
//            }
//            text = runText;
//            if (isMerge) {
//                run.get(i).setText(runText.replace(runText, ""), 0);
//                isMerge = false;
//            }
//            if (runText != null && nextRunText != null && (matcher(runText).find() & matcher(nextRunText).find())) {
//                text = runText + nextRunText;
//                isMerge = true;
//            }
//            if (runText != null && !runText.equals("") &&
//                    matcher(runText.trim()).find() && allKeystr.get().indexOf("|" + text.trim() + "|") != -1) {
//                text = text.trim();
//                run.get(i).setText(runText.replace(runText, map.get(text).toString()), 0);
//                allKeystr.set(allKeystr.get().replace("|" + text + "|", "|"));
//            }
//        }
//    }
//
//    /**
//     * 替换doc模板文件的点位符并生成新的doc文件
//     *
//     * @param srcPath  doc模板源文件,docx格式
//     * @param destPath 替换后的doc文件,doc格式
//     * @param bean     java实体类，字段名和模板点位符对应
//     * @return
//     */
//    public static <T> void searchAndReplace(String srcPath, String destPath, T bean) {
//        try {
//            XWPFDocument document = new XWPFDocument(new FileInputStream(srcPath));
//            // 替换段落中的指定文字
//            Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();
//            Map<String, Object> map = null;
//            //如果设置了keyMap值，则不尝试转换bean为map
//            if (keyMap.get() != null) {
//                map = keyMap.get();
//            } else {
//                map = beanToMap(bean);
//            }
//            StringBuffer sbf = new StringBuffer("|");
//            for (Entry<String, Object> en : map.entrySet()) {
//                sbf.append(en.getKey() + "|");
//            }
//            allKeystr.set(sbf.toString());
//            while (itPara.hasNext()) {
//                XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
//                replaceParaText(paragraph, map);
//            }
//
//            // 替换表格中的指定文字
//            Iterator<XWPFTable> itTable = document.getTablesIterator();
//            while (itTable.hasNext()) {
//                XWPFTable table = (XWPFTable) itTable.next();
//                int count = table.getNumberOfRows();
//                for (int i = 0; i < count; i++) {
//                    XWPFTableRow row = table.getRow(i);
//                    List<XWPFTableCell> cells = row.getTableCells();
//                    for (XWPFTableCell cell : cells) {
//                        List<XWPFParagraph> paragraphsList = cell.getParagraphs();
//                        for (int n = 0; n < paragraphsList.size(); n++) {
//                            XWPFParagraph paragraph = paragraphsList.get(n);
//                            replaceParaText(paragraph, map);
//                        }
//                    }
//                }
//            }
//            FileOutputStream outStream = new FileOutputStream(destPath);
//            document.write(outStream);
//            outStream.close();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//    }
//
//    /**
//     * 匹配传入的字符串是否是定义的doc模板点位符格式
//     *
//     * @param str 要匹配的字符串
//     * @return Matcher
//     */
//    private static Matcher matcher(String str) {
//        Pattern pattern = Pattern.compile("^[a-zA-Z、（）0-9]{2,36}$");
//        Matcher matcher = pattern.matcher(str);
//        return matcher;
//    }
//
//    /**
//     * javaBean转Map
//     *
//     * @param bean
//     * @return Map
//     */
//    public static <T> Map<String, Object> beanToMap(T bean) {
//        Map<String, Object> map = new HashMap<>();
//        if (bean != null) {
//            BeanMap beanMap = BeanMap.create(bean);
//            for (Object key : beanMap.keySet()) {
//                map.put(key.toString(), beanMap.get(key));
//            }
//        }
//        return map;
//    }
//
//    public static void main(String[] args) {
//        int bound = 15;
//        Runnable runnable = new Runnable() {
//            @Override
//            public void run() {
//                while (true) {
//                    try {
//                        new DocWriter().test3(new Random().nextInt(bound));
//                        Thread.sleep(200);
//                    } catch (Exception e) {
//                        e.printStackTrace();
//                    }
//                }
//            }
//        };
//        for (int i = 0; i < bound; i++) {
//            new Thread(runnable).start();
//        }
//        //new DocWriter().test();
//
//        //使用openoffice转换文档
///*		String fileString = "D:/home/soft/eclipseWorkspace/PDFTools/zfws/doc/t_ws_ajyss1.doc";
//		//fileString = "D:/home/soft/eclipseWorkspace/PDFTools/zfws/doc/t_ws_dsrcssbbl1.doc";
//		//fileString = "D:/home/soft/eclipseWorkspace/PDFTools/zfws/doc/t_ws_ajclcp1.doc";
//		DocConvert docConvert = new DocConvert(fileString);
//		docConvert.conver();*/
//    }
//
//    public static void test3(int threadNumber) throws Exception {
//        Base_Entity bookentity = new Entity_Book_2017_2();//统一一个打印实体
//        bookentity.put("安监检记", "安监检记");
//        bookentity.put("字", "字");
//        bookentity.put("号", "号");
//        bookentity.put("被检查单位", "被检查单位");
//        bookentity.put("单位地址", "单位地址");
//        bookentity.put("单位法定代表人或负责人", "单位法定代表人或负责人");
//        bookentity.put("代表人职务", "代表人职务");
//        bookentity.put("代表人联系电话", "代表人联系电话");
//        bookentity.put("检查场所", "检查场所");
//        bookentity.put("检查时间开始", "2019年05月01日13时02分");
//        bookentity.put("检查时间结束", "2019年05月03日13时02分");
//        bookentity.put("所属安全生产监督管理局", "所属安全生产监督管理局");
//        bookentity.put("执法人员姓名1", "执法人员姓名1" + ",");
//        bookentity.put("执法人员姓名2", "执法人员姓名2");
//        bookentity.put("执法人员证件号1", "执法人员证件号1" + ",");
//        bookentity.put("执法人员证件号2", "执法人员证件号2");
//        bookentity.put("检查情况", "检查情况");
//        bookentity.put("检查人员签名1", "检查人员签名1");
//        bookentity.put("检查人员签名2", "检查人员签名2");
//        bookentity.put("被检查单位现场负责人签名", "被检查单位现场负责人签名");
//        bookentity.put("出表日期", "2019年05月04日15时02分");
//        bookentity.put("页数", "1");
//        bookentity.put("页码", "1");
//
//        Map<String, Object> map = new HashMap<>();
//
//        Class<?> clazz = Class.forName(bookentity.getClass().getName());
//        Object object = clazz.newInstance();
//        Field fieldnamelsitchinese = clazz.getDeclaredField("fieldnamelsitchinese");
//        fieldnamelsitchinese.setAccessible(true);
//        List<String> fields = (List<String>) fieldnamelsitchinese.get(object);
//        for (String fieldName : fields) {
//            String fieldKey = PinyinUtils.toHanyuPinyinSimple(fieldName);
//            //System.out.println(fieldName+" -> " + fieldKey);
//            if (fieldName.indexOf("时间") != -1 || fieldName.indexOf("日期") != -1) {
//                parseDateToKeyMap(sdf.get().parse(bookentity.getValue(fieldName)), fieldKey, map);
//            } else {
//                map.put(fieldKey, bookentity.getValue(fieldName));
//            }
//        }
//        map.put("ys", bookentity.getValue("页数"));
//        map.put("ym", bookentity.getValue("页码"));
//
//        String srcPath = "D:\\home\\code\\PDFTools\\zfws\\doc\\template\\现场检查记录.doc";
//        String destPath = "D:\\home\\code\\PDFTools\\zfws\\doc\\template\\现场检查记录" + threadNumber + ".doc";
//        DocWriter.setMap(map);
//        searchAndReplace(srcPath, destPath, null);
//    }
//
//    /**
//     * 生成新的doc文档
//     */
//    public static void writer(Base_Entity bookentity, HttpServletResponse response, String templateName) {
//        Map<String, Object> map = new HashMap<>();
//
//        try {
//            Class<?> clazz = Class.forName(bookentity.getClass().getName());
//            Object object = clazz.newInstance();
//            Field fieldnamelsitchinese = clazz.getDeclaredField("fieldnamelsitchinese");
//            fieldnamelsitchinese.setAccessible(true);
//            List<String> fields = (List<String>) fieldnamelsitchinese.get(object);
//            Pattern pattern = Pattern.compile(datePattern);
//            for (String fieldName : fields) {
//                String fieldKey = PinyinUtils.toHanyuPinyinSimple(fieldName);
//                String value = bookentity.getValue(fieldName);
//                map.put(fieldKey, value);
//                if (fieldName.indexOf("时间") != -1 || fieldName.indexOf("日期") != -1 || fieldName.indexOf("期限") != -1) {
//                    Matcher matcher = pattern.matcher(value);
//                    if (matcher.matches()) {
//                        parseDateToKeyMap(sdf.get().parse(value), fieldKey, map);
//                    }
//                }
//            }
//
//            map.put("ys", bookentity.getValue("页数"));
//            map.put("ym", bookentity.getValue("页码"));
//            File file = ResourceUtils.getFile("classpath:template/doc/zfws/" + templateName + ".doc");
//            String templateFile = file.getPath();
//            String destPath = tempPath + templateName + UUID.randomUUID().toString() + ".doc";
//            DocWriter.setMap(map);
//            searchAndReplace(templateFile, destPath, null);
//            File downloadFile = new File(destPath);
//            ServletUtil.setFileDownloadHeader(response, templateName + ".doc");
//            FileCopyUtils.copy(new FileInputStream(downloadFile), response.getOutputStream());
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//    }
//
//    /**
//     * 解析日期为年月日时分并放入keymap
//     */
//    public static void parseDateToKeyMap(Date date, String fieldKey, Map<String, Object> map) {
//        Calendar calendar = Calendar.getInstance();
//        calendar.setTime(date);
//        int year = calendar.get(Calendar.YEAR);
//        map.put(fieldKey + "n", year);
//        int month = calendar.get(Calendar.MONTH) + 1;
//        map.put(fieldKey + "y", month);
//        int day = calendar.get(Calendar.DAY_OF_MONTH);
//        map.put(fieldKey + "r", day);
//        int hour = calendar.get(Calendar.HOUR_OF_DAY);
//        map.put(fieldKey + "s", hour);
//        int minute = calendar.get(Calendar.MINUTE);
//        map.put(fieldKey + "f", minute);
//    }
//
//}